/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package bs.global.rn;

import bs.global.dao.FormularioDAO;
import bs.global.excepciones.ExcepcionGeneralSistema;
import bs.global.modelo.Comprobante;
import bs.global.modelo.Formulario;
import bs.global.modelo.FormularioPK;
import bs.global.modelo.FormularioPorSituacionIVA;
import bs.stock.modelo.ComprobanteStock;
import bs.stock.modelo.TipoMovimientoStock;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.ejb.Stateless;

/**
 *
 * @author Claudio
 */
@Stateless
public class FormularioRN {

    @EJB private FormularioDAO formularioDAO;
    @EJB private FormularioPorSituacionIVARN formularioPorSituacionIVARN;

    public Formulario getFormulario(FormularioPK idPK){

        return formularioDAO.getFormulario(idPK);
    }

    public void guardar(Formulario formulario) throws Exception {

        FormularioPK idPK = new FormularioPK(formulario.getModfor(),formulario.getCodfor());

        if(formularioDAO.getFormulario(idPK)==null){
            formularioDAO.crear(formulario);
        }else{
            formularioDAO.editar(formulario);
        }
    }

    public Formulario getFormularioStock(ComprobanteStock comprobante) throws ExcepcionGeneralSistema {

        /**
         * Validamos el tipo de movimiento para buscar el formulario por situacion de iva
         * lo correcto es verificar desde donde registra para ver si se busca la situacion de iva
         */
        FormularioPorSituacionIVA fpsi;

        if(comprobante.getTipoMovimiento()== TipoMovimientoStock.A
                || comprobante.getTipoMovimiento()== TipoMovimientoStock.T){

            fpsi = formularioPorSituacionIVARN.getFormulario(comprobante.getIdPK().getModcom(),
                                                                             comprobante.getIdPK().getCodcom(),
                                                                             "X");
        }else{
            /**
             * Aqui se deberia buscar la situacion de iva del cliente o del proveedor
             */
            System.out.println("Falta implementación");
            fpsi = null;
        }

        if(fpsi==null) throw new ExcepcionGeneralSistema("No se encontró formulario");
        return  fpsi.getFormulario();
    }
     
    public Formulario getFormulario(Comprobante comprobante, String cndIva) throws ExcepcionGeneralSistema {

        /**
         * Validamos el tipo de movimiento para buscar el formulario por situacion de iva
         * lo correcto es verificar desde donde registra para ver si se busca la situacion de iva
         */
        FormularioPorSituacionIVA fpsi;
        fpsi = formularioPorSituacionIVARN.getFormulario(comprobante.getIdPK().getModcom(),
                                                                             comprobante.getIdPK().getCodcom(),
                                                                             cndIva);
        
        if(fpsi==null) throw new ExcepcionGeneralSistema("No se encontró formulario por situacion de iva");
        return  fpsi.getFormulario();
    }
     
     

    public void actualizarUltimoNumero(Formulario formulario) throws Exception {

        formulario.setUltimoNumero(formulario.getUltimoNumero() + 1);
        guardar(formulario);
    }

    public int tomarProximoNumero(Formulario formulario) throws ExcepcionGeneralSistema {
        try {
            FormularioPK idPK = new FormularioPK(formulario.getModfor(), formulario.getCodfor());
            Formulario f = getFormulario(idPK);
            if (f == null) {
                throw new ExcepcionGeneralSistema("No se encontró formulario " + formulario.getCodfor() + " - " + formulario.getDescripcion());
            }
            int ultimoNumero = f.getUltimoNumero();
            ultimoNumero++;
            f.setUltimoNumero(ultimoNumero);
            guardar(f);
            return ultimoNumero;
        } catch (Exception ex) {
            Logger.getLogger(FormularioRN.class.getName()).log(Level.SEVERE,
                    "No es posible actualizar formulario ", ex);

            return 0;
        }


    }
}
